home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / telecomm / bbs / tbbs093.lha / Programmer / TechFList_src / TechFList.c < prev   
C/C++ Source or Header  |  1994-05-13  |  4KB  |  135 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <exec/ports.h>
  4. #include <dos/dos.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <lists.h>
  9.  
  10. #include <clib/alib_protos.h>
  11.  
  12. #include <proto/exec.h>
  13. #include <proto/dos.h>
  14. #include <proto/utility.h>
  15.  
  16. #include "techprg.h"
  17.  
  18. const char verstr[] = { "\0$VER: TechFList 0.02  (" __COMMODORE_DATE__ ")" };
  19.  
  20. void main(int, char **);
  21. void *SendBBSMsg(UWORD, void *);
  22. void WriteList(struct DirNode *, BPTR);
  23.  
  24. struct MsgPort *ReplyPort, *TechConPort;
  25.  
  26. char *StrBuf, *AreaName;
  27.  
  28. struct DateTime *dt;
  29.  
  30. void main(int ac, char **av)
  31. {
  32.     if(!(StrBuf = malloc(1024 + sizeof(struct DateTime) + 16))) exit(103);
  33.     dt = StrBuf + 1024;
  34.     bzero(dt, sizeof(struct DateTime));
  35.     dt->dat_Format = FORMAT_DOS;
  36.     dt->dat_StrDate = (STRPTR)(dt + 1);
  37.     if(ac == 5) {
  38.         {
  39.             BPTR bptr;
  40.  
  41.             if(bptr = Lock(av[2], ACCESS_READ)) UnLock(bptr);
  42.             else if(bptr = Open(av[2], MODE_NEWFILE)) Close(bptr);
  43.             SetComment(av[2], av[4]);
  44.         }
  45.         if(ReplyPort = CreateMsgPort()) {
  46.             Forbid();
  47.             if(TechConPort = FindPort("TechCon_Private")) SendBBSMsg(ID_INCOPENCOUNT, NULL);
  48.             Permit();
  49.             if(TechConPort) {
  50.                 struct DirNode *FileRoot;
  51.  
  52.                 if(FileRoot = SendBBSMsg(ID_LOCKFILEROOT, NULL)) {
  53.                     BPTR list, header;
  54.  
  55.                     if(list = Open(av[2], MODE_NEWFILE)) {
  56.                         if(header = Open(av[3], MODE_OLDFILE)) {
  57.                             while(FGets(header, StrBuf, 511)) FPuts(list, StrBuf);
  58.                             Close(header);
  59.                         }
  60.                         AreaName = StrBuf;
  61.                         *AreaName = 0;
  62.                         WriteList(FileRoot, list);
  63.                         Close(list);
  64.                     }
  65.                 }
  66.                 SendBBSMsg(ID_FREEFILEROOT, NULL);
  67.                 SendBBSMsg(ID_DECOPENCOUNT, NULL);
  68.             } else PutStr("Couldn't find TechCon\n");
  69.             DeleteMsgPort(ReplyPort);
  70.         }
  71.     } else Printf("Usage: %s <ignored> <filelist> <header> <comment>\n", av[0]);
  72.     exit(0);
  73. }
  74.  
  75. void *SendBBSMsg(UWORD ID, void *data)
  76. {
  77.     static struct BBSMsg *sndmsg = NULL;
  78.  
  79.     if(!sndmsg) sndmsg = calloc(sizeof(struct BBSMsg), 1);
  80.     else bzero(sndmsg, sizeof(struct BBSMsg));
  81.     sndmsg->SendingNode = -1;
  82.     sndmsg->ID = ID;
  83.     sndmsg->data = data;
  84.     sndmsg->Msg.mn_ReplyPort = ReplyPort;
  85.     PutMsg(TechConPort, (struct Message *)sndmsg);
  86.     Wait(1 << ReplyPort->mp_SigBit);
  87.     while(GetMsg(ReplyPort)) ;
  88.     return(sndmsg->result);
  89. }
  90.  
  91. const char filefmt[] = { "%-16s %8lu %s %s\n" };
  92.  
  93. void WriteList(struct DirNode *dnode, BPTR fh)
  94. {
  95.     if(dnode->fc->Misc) {
  96.         struct Node *misc = GetHead(dnode->fc->Misc);
  97.  
  98.         while(misc) {
  99.             if(!Strnicmp(misc->ln_Name, "*NOLIST", 7)) return();
  100.             misc = GetSucc(misc);
  101.         }
  102.     }
  103.     strcpy(AreaName, dnode->fc->Name);
  104.     if(dnode->flist) {
  105.         struct FileNode *fn;
  106.  
  107.         FPrintf(fh, "\nArea: %s\n\n", StrBuf);
  108.         fn = GetHead(dnode->flist);
  109.         while(fn) {
  110.             dt->dat_Stamp.ds_Days = fn->Days;
  111.             DateToStr(dt);
  112.             if(fn->LongDesc && fn->DescLines) {
  113.                 long cnt;
  114.  
  115.                 FPrintf(fh, filefmt, fn->Name, fn->Size, dt->dat_StrDate, fn->DescLines[0]);
  116.                 for(cnt = 1; cnt < fn->LongDesc; cnt++) FPrintf(fh, "%36s%s\n", "", fn->DescLines[cnt]);
  117.             } else FPrintf(fh, filefmt, fn->Name, fn->Size, dt->dat_StrDate, fn->Comment);
  118.             fn = GetSucc(fn);
  119.         }
  120.     }
  121.     if(dnode->dlist) {
  122.         struct DirNode *dn;
  123.         char *OldName = AreaName;
  124.  
  125.         strcat(AreaName, " -> ");
  126.         AreaName += strlen(AreaName);
  127.         dn = GetHead(dnode->dlist);
  128.         while(dn) {
  129.             WriteList(dn, fh);
  130.             dn = GetSucc(dn);
  131.         }
  132.         AreaName = OldName;
  133.     }
  134. }
  135.